package com.neuedu.javase.tools.str;

import java.io.UnsupportedEncodingException;

/***
 * 项目名称:  MyJavaSE 
 * 包：  com.neuedu.javase.tools.str 
 * date:   2025/10/30   8:50  
 * 描述:  
 *  @author : 张金山
 *  作者博客:   https://blog.fulfill.com.cn
 */
public class MyString {


    public static void main(String[] args) throws UnsupportedEncodingException {

        //String 引用类型， 不是基础类型

        //创建对象 使用构造函数
        String str1 = new String("Hello Java1");
        String str2 = new String(new byte[]{65,66,67});

        System.out.println("str1 = " + str1);
        System.out.println("str2 = " + str2);

        // 获取字符串的长度
        System.out.println("str1.length() = " + str1.length());
        System.out.println("str2.length() = " + str2.length());


        // 使用字面量的形式构造对象  常用  字符串 字面量的对象存储在常量区 (池)  同一个字面常量 是一个对象,多个引用 指向的是同一个对象

        String str3 ="Hello Java1";
        String str4 ="Hello Java1";

        System.out.println("(str3 == str4) = " + (str3 == str4));

        /**
         * 因为String内部使用是个  byte数组，使用的是 final 声明的 所以对象一旦创建不可以修改
         *  https://openjdk.org/jeps/254
         *  JDK9+   private final byte[] value;
         *  JDK8-   private final char[] value;
         */
        String str5 = "Hello Java1";

        str5 = "Other java 2 ";



        //字符串的比较
        String str6 = "Hello Java1";
        String str7 = "Hello Java1";
        String str8 = new String("Hello Java1");

        System.out.println("str6 = " + str6);
        System.out.println("str7 = " + str7);
        System.out.println("str8 = " + str8);
        System.out.println("(str6 == str7) = " + (str6 == str7));  //true
        System.out.println("(str7 == str8) = " + (str7 == str8));   //false

        //字面量相等  equals
        /** String  重写
         * public boolean equals(Object anObject) {
         *         if (this == anObject) {
         *             return true;
         *         }
         *         return (anObject instanceof String aString)
         *                 && (!COMPACT_STRINGS || this.coder == aString.coder)
         *                 && StringLatin1.equals(value, aString.value);
         *     }
         */
        System.out.println("str7.equals(str8) = " + str7.equals(str8));  //true


        System.out.println("\"Abc\".equals(\"abc\") = " + "Abc".equals("abc"));  //false
        System.out.println("\"Abc\".equalsIgnoreCase(\"abc\") = " + "Abc".equalsIgnoreCase("abc"));   //true


        //比较大小  A 65  B 66
        System.out.println("\"A\".compareTo(\"B\") = " + "A".compareTo("B"));     // -1
        System.out.println("\"B\".compareTo(\"A\") = " + "B".compareTo("A"));    // +1
        System.out.println("\"A\".compareTo(\"A\") = " + "A".compareTo("A"));     // 0



        //判断  开头  和结尾
        /**
         * String fileName = "新建 XLS 工作表 (2).xls"
         */

        String fileName = "新建 XLS 工作表 (2).xls";

        System.out.println("fileName.endsWith(\".xls\") = " + fileName.endsWith(".xls"));
        System.out.println("fileName.startsWith(\"新建\") = " + fileName.startsWith("新建"));


        /**
         * byte[]　getBytes(Charset　charset)	使用给定的　charset将此String　编码到byte　序列，并将结果存储到新的byte　数组
         * String[]　split(String　regex)	根据给定正则表达式的匹配拆分此字符串。
         * String　replace(char　oldChar,　char　newChar)	返回一个新的字符串，它是通过用newChar　替换此字符串中出现的所有oldChar　得到的
         * String　toUpperCase()	将String对象中的所有字符都转换为大写
         * String　toLowerCase()	将String对象中的所有字符都转换为小写
         * char　charAt(int)	返回指定索引处的　char　值
         * String　substring(int　begin)	返回一个新字符串，该字符串是从begin开始的字符串的内容
         * String　substring(int　begin,int　end)	返回一个新字符串，该字符串是从begin开始到end-1结束的字符串的内容
         * int　indexOf/lastIndexOf(char)	返回指定字符在此字符串中第一次/最后一次出现处的索引。
         * int　indexOf/lastIndexOf(char,int)	从指定的索引开始搜索，返回在此字符串中第一次/最后一次出现指定字符处的索引
         * int　indexOf/lastIndexOf(String)	返回第一次出现的指定子字符串在此字符串中的索引
         * int　indexOf/lastIndexOf(String,int)	从指定的索引开始搜索，返回在此字符串中第一次/最后一次出现指定字符串处的索引
         * String　trim()	返回新的字符串，忽略前导空白和尾部空白
         * int　length()	返回此字符串的长度
         * String　concat(String　str)	将指定字符串连接到此字符串的结尾
         * byte[]　getBytes()	使用平台的默认字符集将此String　编码为byte　序列，并将结果存储到一个新的byte　数组中
         */


        // * byte[]　getBytes(Charset　charset)	使用给定的　charset将此String　编码到byte　序列，并将结果存储到新的byte　数组
        System.out.println("=========================getBytes=========================================");

        String info = "我是一句中文, hello abc ";

        byte[] bytes1 = info.getBytes();
        byte[] bytes2 = info.getBytes("GBK");
        byte[] bytes3 = info.getBytes("UTF-8");



        System.out.println("=========================Charset=========================================");

        // DEBUG
        //[ -26, -120, -111, -26, -104, -81, -28, -72, -128, -27, -113, -91, -28, -72, -83, -26, -106, -121, 44, 32, 104, 101, 108, 108, 111, 32, 97, 98, 99, 32 ]
        System.out.println("bytes1 = " + bytes1);
        //[ -50, -46, -54, -57, -46, -69, -66, -28, -42, -48, -50, -60, 44, 32, 104, 101, 108, 108, 111, 32, 97, 98, 99, 32 ]
        System.out.println("bytes2 = " + bytes2);
        //[ -26, -120, -111, -26, -104, -81, -28, -72, -128, -27, -113, -91, -28, -72, -83, -26, -106, -121, 44, 32, 104, 101, 108, 108, 111, 32, 97, 98, 99, 32 ]
        System.out.println("bytes3 = " + bytes3);

        //GBK
        byte[] bytes4 = new byte[]{ -50, -46, -54, -57, -46, -69, -66, -28, -42, -48, -50, -60, 44, 32, 104, 101, 108, 108, 111, 32, 97, 98, 99, 32 };
        //UTF-8
        byte[] bytes5 = new byte[]{ -26, -120, -111, -26, -104, -81, -28, -72, -128, -27, -113, -91, -28, -72, -83, -26, -106, -121, 44, 32, 104, 101, 108, 108, 111, 32, 97, 98, 99, 32 };

        //new String(bytes4) = ����һ������, hello abc
        System.out.println("new String(bytes4) = " + new String(bytes4));

        //new String(bytes4) = 我是一句中文, hello abc
        System.out.println("new String(bytes4) = " + new String(bytes4,"GBK"));

        // new String(bytes5) = 我是一句中文, hello abc
        System.out.println("new String(bytes5) = " + new String(bytes5));



        //   * String[]　split(String　regex)	根据给定正则表达式的匹配拆分此字符串。
        System.out.println("=========================split=========================================");

        String names = "张飞,刘备,诸葛亮";
        // String[] splits = names.split("");
        String[] splits = names.split(",");
        for (int i = 0; i < splits.length; i++) {
            System.out.println("splits["+i+"] = " + splits[i]);
        }

    //  * String　replace(char　oldChar,　char　newChar)	返回一个新的字符串，它是通过用newChar　替换此字符串中出现的所有oldChar　得到的
        System.out.println("=========================replace=========================================");
        String oldStr = "Hello  Java ";

        System.out.println("replace之前oldStr = " + oldStr);

        String newStr = oldStr.replace("Java", "Python");

        System.out.println("replace之后oldStr = " + oldStr);
        System.out.println("newStr = " + newStr);


        /**
         *   * String　toUpperCase()	将String对象中的所有字符都转换为大写
         *     * String　toLowerCase()	将String对象中的所有字符都转换为小写
         */
        System.out.println("========================= 切换大小写 =========================================");
        String myStr = " Hello My Name is Jshand";

        System.out.println("myStr = " + myStr);
        System.out.println("myStr.toUpperCase() = " + myStr.toUpperCase());
        System.out.println("myStr.toLowerCase() = " + myStr.toLowerCase());



        /**
         * String　trim()	返回新的字符串，忽略前导空白和尾部空白
         * int　length()	返回此字符串的长度
         * String　concat(String　str)	将指定字符串连接到此字符串的结尾
         * byte[]　getBytes()	使用平台的默认字符集将此String　编码为byte　序列，并将结果存储到一个新的byte　数组中
         */

        //         * char　charAt(int)	返回指定索引处的　char　值
        System.out.println("========================= charAt =========================================");

        String charAtStr = "Hello World!";
        System.out.println("charAtStr = " + charAtStr);
        System.out.println("charAtStr.charAt(0) = " + charAtStr.charAt(0));  //H
        System.out.println("charAtStr.charAt(1) = " + charAtStr.charAt(1));  //e

        //使用 length() + charAt遍历字符串
        for (int i = 0; i < charAtStr.length(); i++) {
            System.out.println("遍历: charAtStr.charAt("+i+") = " + charAtStr.charAt(i));
        }




        /**
         * * int　indexOf/lastIndexOf(char)	返回指定字符在此字符串中第一次/最后一次出现处的索引。
         *          * int　indexOf/lastIndexOf(char,int)	从指定的索引开始搜索，返回在此字符串中第一次/最后一次出现指定字符处的索引
         *          * int　indexOf/lastIndexOf(String)	返回第一次出现的指定子字符串在此字符串中的索引
         *          * int　indexOf/lastIndexOf(String,int)	从指定的索引开始搜索，返回在此字符串中第一次/最后一次出现指定字符串处的
         */
        System.out.println("========================= indexOf =========================================");
        String uploadFileName  = "vite.config.ts";
        System.out.println("uploadFileName = " + uploadFileName);
        System.out.println("uploadFileName.indexOf(\".\") = " + uploadFileName.indexOf("."));
        System.out.println("uploadFileName.lastIndexOf(\".\") = " + uploadFileName.lastIndexOf("."));


        /**
         *   * String　substring(int　begin)	返回一个新字符串，该字符串是从begin开始的字符串的内容
         *   * String　substring(int　begin,int　end)	返回一个新字符串，该字符串是从begin开始到end-1结束的字符串的内容
         */
        System.out.println("========================= substring =========================================");
        System.out.println("uploadFileName = " + uploadFileName);

        System.out.println("uploadFileName.substring(11,13) = " + uploadFileName.substring(11, 14));
        System.out.println("uploadFileName.substring(11) = " + uploadFileName.substring(11));

        System.out.println("uploadFileName.substring(uploadFileName.lastIndexOf(\".\"), 14) = " + uploadFileName.substring(uploadFileName.lastIndexOf("."), 14));
        System.out.println("uploadFileName.substring(uploadFileName.lastIndexOf(\".\")) = " + uploadFileName.substring(uploadFileName.lastIndexOf(".")));




        System.out.println("========================= trim =========================================");
        String name = "         My  name is jshand                                      " ;
        System.out.println("name = " + name);
        String trimName = name.trim();  //返回一个新的字符串， 不会改变 原来的字符串
        System.out.println("trimName = " + trimName);
        System.out.println("name = " + name);

        System.out.println("========================= concat =========================================");
        String c1 = "Hello ";
        String c2 = "Java ";
        String c3 = "I Love ";

        String concatStr = c1.concat(c2).concat(c3);
        System.out.println("c1.concat(c2).concat(c3) : "+(c1.concat(c2).concat(c3)));


    }
}
